package com.cwnu.sw.cys.core.common.domain.vo.resp;

import com.cwnu.sw.cys.core.common.exception.ErrorEnum;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * 基础返回体，用于封装接口返回结果。
 * 包含成功标识、错误码、错误消息和返回数据。
 *
 * @param <T> 返回数据的具体类型
 * @author jisam
 * @version 1.0
 * @contact "jisamchan@outlook.com"
 * @date 22/03/2025
 */
@Data
@ApiModel("基础返回体")
@JsonIgnoreProperties(ignoreUnknown = true)
public class ApiResult<T> {

    /**
     * 成功标识，true 表示请求成功，false 表示请求失败。
     */
    @ApiModelProperty("成功标识true or false")
    private Boolean success;

    /**
     * 错误码，当请求失败时使用，用于标识具体的错误类型。
     */
    @ApiModelProperty("错误码")
    private Integer errCode;

    /**
     * 错误消息，当请求失败时使用，用于描述具体的错误信息。
     */
    @ApiModelProperty("错误消息")
    private String errMsg;

    /**
     * 返回对象，当请求成功时使用，用于封装返回的数据。
     */
    @ApiModelProperty("返回对象")
    private T data;

    /**
     * 创建一个成功的返回结果，返回数据为空。
     *
     * @param <T> 返回数据的类型
     * @return 成功的返回结果
     */
    public static <T> ApiResult<T> success() {
        ApiResult<T> result = new ApiResult<>();
        result.setData(null);
        result.setSuccess(Boolean.TRUE);
        return result;
    }

    /**
     * 创建一个成功的返回结果，包含指定的返回数据。
     *
     * @param data 返回的数据
     * @param <T> 返回数据的类型
     * @return 成功的返回结果
     */
    public static <T> ApiResult<T> success(T data) {
        ApiResult<T> result = new ApiResult<>();
        result.setData(data);
        result.setSuccess(Boolean.TRUE);
        return result;
    }

    /**
     * 创建一个失败的返回结果，包含自定义的错误码和错误消息。
     *
     * @param code 错误码
     * @param msg  错误消息
     * @param <T> 返回数据的类型
     * @return 失败的返回结果
     */
    public static <T> ApiResult<T> fail(Integer code, String msg) {
        ApiResult<T> result = new ApiResult<>();
        result.setSuccess(Boolean.FALSE);
        result.setErrCode(code);
        result.setErrMsg(msg);
        return result;
    }

    /**
     * 创建一个失败的返回结果，基于预定义的错误枚举。
     *
     * @param errorEnum 错误枚举，包含错误码和错误消息
     * @param <T> 返回数据的类型
     * @return 失败的返回结果
     */
    public static <T> ApiResult<T> fail(ErrorEnum errorEnum) {
        ApiResult<T> result = new ApiResult<>();
        result.setSuccess(Boolean.FALSE);
        result.setErrCode(errorEnum.getErrorCode());
        result.setErrMsg(errorEnum.getErrorMsg());
        return result;
    }

    /**
     * 获取请求是否成功。
     *
     * @return true 表示成功，false 表示失败
     */
    public boolean isSuccess() {
        return this.success;
    }
}
